info <- read.csv("../data/train_set/label.csv")
load("../output/fiducial_pt_list.Rdata")
library(readxl)
# A function to plot histogram of distribution of pairwise distance for each emotion
# input: emotion index, first point, second point, vertical or horizontal distance
# output: histogram of distance distribution
dist_histogram_by_emotion <- function(emotion_idx, pt1, pt2, vertical = T){
    indices <- info[info$emotion_idx == emotion_idx, 'Index']
    emotion <- as.character(info[info$emotion_idx == emotion_idx, 'emotion_cat'])[1]
    ver.dist <- function(idx){
        if(vertical){
        ver.loc <- fiducial_pt_list[[idx]][,2]
        }
        else{
        ver.loc <- fiducial_pt_list[[idx]][,1] 
        }
        pairwise_dist <- as.matrix(dist(ver.loc))
        ver.dist <- pairwise_dist[pt1,pt2]
    return(ver.dist)
    }
    dist_distribution <- sapply(indices, ver.dist)
    #jpeg(paste(c('../output/hist', emotion_idx,"_", pt1, "_", pt2, '.jpg'), collapse = ''),
    #width = 500, height = 375)
    hist(dist_distribution, xlab = "distance", 
         main = paste(c(emotion, "distance between", pt1, "and", pt2),collapse = " ")) 
    abline(v = mean(dist_distribution))
    #dev.off()
}

# A function to generalize "dist_histogram_by_emotion" to all emotions 
dist_histogram <- function(pt1, pt2, vertical = T){
  lapply(1:22, dist_histogram_by_emotion, pt1, pt2, vertical)
}

#examples
dist_histogram(50,52)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

[[7]]
NULL

[[8]]
NULL

[[9]]
NULL

[[10]]
NULL

[[11]]
NULL

[[12]]
NULL

[[13]]
NULL

[[14]]
NULL

[[15]]
NULL

[[16]]
NULL

[[17]]
NULL

[[18]]
NULL

[[19]]
NULL

[[20]]
NULL

[[21]]
NULL

[[22]]
NULL
dist_histogram(1,21)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

[[7]]
NULL

[[8]]
NULL

[[9]]
NULL

[[10]]
NULL

[[11]]
NULL

[[12]]
NULL

[[13]]
NULL

[[14]]
NULL

[[15]]
NULL

[[16]]
NULL

[[17]]
NULL

[[18]]
NULL

[[19]]
NULL

[[20]]
NULL

[[21]]
NULL

[[22]]
NULL
library(EBImage)
# a function display fiducial points on images
# input: identity index
# output: all images associated with the identity with fiducial points marked
display_fid_pt <- function(identity){
    indices <- info[info$identity == identity, 'Index']
    emotions <- as.character(info[info$identity == identity, 'emotion_cat'])
    image.path_sub <- paste0(train_image_dir, sprintf("%04d", indices), ".jpg")
    Image_list_sub <- lapply(image.path_sub, EBImage::readImage)
    fiducial_pt_list_sub <- fiducial_pt_list[indices]

    display_single <- function(j){
        #jpeg(paste(c('../output/', identity,'_', j, '.jpg'), collapse = ''), width = 500, height = 375)
        display(Image(Image_list_sub[[j]], colormode = 'Color'), method="raster")
        text(x = 170, y = 50, label = emotions[j], cex = 1.5)
        add_point <- function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
        #lapply(1:78,add_point)
        #dev.off() 
}

    lapply(1:length(indices), display_single) 
}

display_fid_pt(117)

[[1]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f76e360d8>

[[2]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f76dd56e0>

[[3]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f745cafd8>

[[4]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f741fe698>

[[5]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73fef788>

[[6]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73be1e10>

[[7]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73af2c50>

[[8]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73a71448>

[[9]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73993b50>

[[10]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f73777ed0>

[[11]]
function(n){text(x = fiducial_pt_list_sub[[j]][n,1],
                                      y = fiducial_pt_list_sub[[j]][n,2],
                                      label = as.character(n), col = "white", cex = 0.8)}
<bytecode: 0x0000025f78427140>
<environment: 0x0000025f736a33c8>

LS0tDQp0aXRsZTogIkZ1bmN0aW9ucyB0byBHZW5lcmF0ZSBGaWd1cmUgMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBpbmZvX3ByaW50OiBwYWdlZA0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBpbmZvX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpgYGB7cn0NCmluZm8gPC0gcmVhZC5jc3YoIi4uL2RhdGEvdHJhaW5fc2V0L2xhYmVsLmNzdiIpDQpsb2FkKCIuLi9vdXRwdXQvZmlkdWNpYWxfcHRfbGlzdC5SZGF0YSIpDQpsaWJyYXJ5KHJlYWR4bCkNCiMgQSBmdW5jdGlvbiB0byBwbG90IGhpc3RvZ3JhbSBvZiBkaXN0cmlidXRpb24gb2YgcGFpcndpc2UgZGlzdGFuY2UgZm9yIGVhY2ggZW1vdGlvbg0KIyBpbnB1dDogZW1vdGlvbiBpbmRleCwgZmlyc3QgcG9pbnQsIHNlY29uZCBwb2ludCwgdmVydGljYWwgb3IgaG9yaXpvbnRhbCBkaXN0YW5jZQ0KIyBvdXRwdXQ6IGhpc3RvZ3JhbSBvZiBkaXN0YW5jZSBkaXN0cmlidXRpb24NCmRpc3RfaGlzdG9ncmFtX2J5X2Vtb3Rpb24gPC0gZnVuY3Rpb24oZW1vdGlvbl9pZHgsIHB0MSwgcHQyLCB2ZXJ0aWNhbCA9IFQpew0KICAgIGluZGljZXMgPC0gaW5mb1tpbmZvJGVtb3Rpb25faWR4ID09IGVtb3Rpb25faWR4LCAnSW5kZXgnXQ0KICAgIGVtb3Rpb24gPC0gYXMuY2hhcmFjdGVyKGluZm9baW5mbyRlbW90aW9uX2lkeCA9PSBlbW90aW9uX2lkeCwgJ2Vtb3Rpb25fY2F0J10pWzFdDQogICAgdmVyLmRpc3QgPC0gZnVuY3Rpb24oaWR4KXsNCiAgICAgICAgaWYodmVydGljYWwpew0KICAgICAgICB2ZXIubG9jIDwtIGZpZHVjaWFsX3B0X2xpc3RbW2lkeF1dWywyXQ0KICAgICAgICB9DQogICAgICAgIGVsc2V7DQogICAgICAgIHZlci5sb2MgPC0gZmlkdWNpYWxfcHRfbGlzdFtbaWR4XV1bLDFdIA0KICAgICAgICB9DQogICAgICAgIHBhaXJ3aXNlX2Rpc3QgPC0gYXMubWF0cml4KGRpc3QodmVyLmxvYykpDQogICAgICAgIHZlci5kaXN0IDwtIHBhaXJ3aXNlX2Rpc3RbcHQxLHB0Ml0NCiAgICByZXR1cm4odmVyLmRpc3QpDQogICAgfQ0KICAgIGRpc3RfZGlzdHJpYnV0aW9uIDwtIHNhcHBseShpbmRpY2VzLCB2ZXIuZGlzdCkNCiAgICAjanBlZyhwYXN0ZShjKCcuLi9vdXRwdXQvaGlzdCcsIGVtb3Rpb25faWR4LCJfIiwgcHQxLCAiXyIsIHB0MiwgJy5qcGcnKSwgY29sbGFwc2UgPSAnJyksDQogICAgI3dpZHRoID0gNTAwLCBoZWlnaHQgPSAzNzUpDQogICAgaGlzdChkaXN0X2Rpc3RyaWJ1dGlvbiwgeGxhYiA9ICJkaXN0YW5jZSIsIA0KICAgICAgICAgbWFpbiA9IHBhc3RlKGMoZW1vdGlvbiwgImRpc3RhbmNlIGJldHdlZW4iLCBwdDEsICJhbmQiLCBwdDIpLGNvbGxhcHNlID0gIiAiKSkgDQogICAgYWJsaW5lKHYgPSBtZWFuKGRpc3RfZGlzdHJpYnV0aW9uKSkNCiAgICAjZGV2Lm9mZigpDQp9DQoNCiMgQSBmdW5jdGlvbiB0byBnZW5lcmFsaXplICJkaXN0X2hpc3RvZ3JhbV9ieV9lbW90aW9uIiB0byBhbGwgZW1vdGlvbnMgDQpkaXN0X2hpc3RvZ3JhbSA8LSBmdW5jdGlvbihwdDEsIHB0MiwgdmVydGljYWwgPSBUKXsNCiAgbGFwcGx5KDE6MjIsIGRpc3RfaGlzdG9ncmFtX2J5X2Vtb3Rpb24sIHB0MSwgcHQyLCB2ZXJ0aWNhbCkNCn0NCg0KI2V4YW1wbGVzDQpkaXN0X2hpc3RvZ3JhbSg1MCw1MikNCmRpc3RfaGlzdG9ncmFtKDEsMjEpDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KEVCSW1hZ2UpDQojIGEgZnVuY3Rpb24gZGlzcGxheSBmaWR1Y2lhbCBwb2ludHMgb24gaW1hZ2VzDQojIGlucHV0OiBpZGVudGl0eSBpbmRleA0KIyBvdXRwdXQ6IGFsbCBpbWFnZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpZGVudGl0eSB3aXRoIGZpZHVjaWFsIHBvaW50cyBtYXJrZWQNCmRpc3BsYXlfZmlkX3B0IDwtIGZ1bmN0aW9uKGlkZW50aXR5KXsNCiAgICBpbmRpY2VzIDwtIGluZm9baW5mbyRpZGVudGl0eSA9PSBpZGVudGl0eSwgJ0luZGV4J10NCiAgICBlbW90aW9ucyA8LSBhcy5jaGFyYWN0ZXIoaW5mb1tpbmZvJGlkZW50aXR5ID09IGlkZW50aXR5LCAnZW1vdGlvbl9jYXQnXSkNCiAgICBpbWFnZS5wYXRoX3N1YiA8LSBwYXN0ZTAodHJhaW5faW1hZ2VfZGlyLCBzcHJpbnRmKCIlMDRkIiwgaW5kaWNlcyksICIuanBnIikNCiAgICBJbWFnZV9saXN0X3N1YiA8LSBsYXBwbHkoaW1hZ2UucGF0aF9zdWIsIEVCSW1hZ2U6OnJlYWRJbWFnZSkNCiAgICBmaWR1Y2lhbF9wdF9saXN0X3N1YiA8LSBmaWR1Y2lhbF9wdF9saXN0W2luZGljZXNdDQoNCiAgICBkaXNwbGF5X3NpbmdsZSA8LSBmdW5jdGlvbihqKXsNCiAgICAgICAgI2pwZWcocGFzdGUoYygnLi4vb3V0cHV0LycsIGlkZW50aXR5LCdfJywgaiwgJy5qcGcnKSwgY29sbGFwc2UgPSAnJyksIHdpZHRoID0gNTAwLCBoZWlnaHQgPSAzNzUpDQogICAgICAgIGRpc3BsYXkoSW1hZ2UoSW1hZ2VfbGlzdF9zdWJbW2pdXSwgY29sb3Jtb2RlID0gJ0NvbG9yJyksIG1ldGhvZD0icmFzdGVyIikNCiAgICAgICAgdGV4dCh4ID0gMTcwLCB5ID0gNTAsIGxhYmVsID0gZW1vdGlvbnNbal0sIGNleCA9IDEuNSkNCiAgICAgICAgYWRkX3BvaW50IDwtIGZ1bmN0aW9uKG4pe3RleHQoeCA9IGZpZHVjaWFsX3B0X2xpc3Rfc3ViW1tqXV1bbiwxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGZpZHVjaWFsX3B0X2xpc3Rfc3ViW1tqXV1bbiwyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBhcy5jaGFyYWN0ZXIobiksIGNvbCA9ICJ3aGl0ZSIsIGNleCA9IDAuOCl9DQogICAgICAgICNsYXBwbHkoMTo3OCxhZGRfcG9pbnQpDQogICAgICAgICNkZXYub2ZmKCkgDQp9DQoNCiAgICBsYXBwbHkoMTpsZW5ndGgoaW5kaWNlcyksIGRpc3BsYXlfc2luZ2xlKSANCn0NCg0KZGlzcGxheV9maWRfcHQoMTE3KQ0KDQpgYGANCg0K